use proc_macro::TokenStream;
use quote::quote;
use syn;

#[proc_macro_derive(HelloMacro)]
/// 过程宏实现入口
/// 1. 使用syn库将输入的TokenStream解析为AST抽象语法树
/// 2. 通过impl_hello_macro函数生成具体实现代码
/// 3. 将生成的代码转换为输出的TokenStream
pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
    let ast = syn::parse(input).unwrap();
    impl_hello_macro(&ast)
}

/// 宏展开核心逻辑
/// 1. 从AST中提取结构体/枚举的名称标识
/// 2. 使用quote!宏生成实现代码模板
/// 3. 将模板转换为TokenStream返回
/// 注意：quote!宏可以将Rust代码转换为TokenStream，
/// 其中#name会被替换为具体的类型标识符
fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
    let name = &ast.ident;
    let gen = quote! {
        impl HelloMacro for #name {
            fn hello_macro() {
                println!("Hello, Macro! My name is {}!", stringify!(#name));
            }
        }
    };
    gen.into()
}